#include <iostream>
#include <pthread.h>
#include <string.h>
#include <string>
#include <unistd.h>
using namespace std;

//线程局部存储
__thread int shared_value = 100;

void *start(void *args)
{
    string name = static_cast<const char*>(args);
    while (true)
    {
        printf("new thread, name: %s, shared_value: %d, &shared_value: %p\n", 
            name.c_str(), shared_value, &shared_value);
        sleep(1);
    }
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, start, (void*)"thread_1");
    while (true)
    {
        printf("main thread, shared_value: %d, &shared_value: %p\n", shared_value, &shared_value);
        shared_value += 10;
        sleep(1);
    }
    pthread_join(tid, nullptr);
    return 0;
}

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, start, (void*)"thread_1");
//     pthread_detach(tid);

//     sleep(5);

//     void *ret = nullptr;
//     int n = pthread_join(tid, &ret);
//     cout << "new thread exit code : " << (long long)ret << ", n : " << n << endl;
//     return 0;
// }

// class ThreadData
// {
// public:
//     ThreadData()
//     {}
//     ~ThreadData()
//     {}
//     void Init(const string &name, int a, int b)
//     {
//         _name = name;
//         _a = a;
//         _b = b;
//     }
//     void Excute()
//     {
//         _result = _a + _b;
//     }
//     void Setid(pthread_t id)
//     {
//         _id = id;
//     }
//     pthread_t id()
//     {
//         return _id;
//     }
//     string &Name()
//     {
//         return _name;
//     }
//     int A()
//     {
//         return _a;
//     }
//     int B()
//     {
//         return _b;
//     }
//     int Result()
//     {
//         return _result;
//     }
// private:
//     string _name;
//     int _a;
//     int _b;
//     int _result;
//     pthread_t _id;
// };

// void *routine(void *args)
// {
//     ThreadData *td = reinterpret_cast<ThreadData*>(args);
//     while (true)
//     {
//         td->Excute();
//         cout << "我是新线程，我的名字是：" << td->Name() << ", id : " << td->id() << endl;
//         sleep(2);
//         break;
//     }
//     return td;
// }

// #define NUM 10

// int main()
// {
//     //1.准备要处理的数据
//     ThreadData td[NUM];
//     for (int i = 0; i < NUM; i++)
//     {
//         char buffer[64];
//         snprintf(buffer, sizeof(buffer), "thread_%d", i);
//         td[i].Init(buffer, i * 10, i * 20);
//     }

//     //2.创建多个线程
//     for (int i = 0; i < NUM; i++)
//     {
//         pthread_t tid;
//         pthread_create(&tid, nullptr, routine, &td[i]);
//         td[i].Setid(tid);
//     }

//     //3.等待多个线程
//     for (int i = 0; i < NUM; i++)
//     {
//         pthread_join(td[i].id(), nullptr);
//     }

//     //4.汇总结果
//     for (int i = 0; i < NUM; i++)
//     {
//         printf("td[%d]: %d+%d=%d[%ld]\n", i, td[i].A(), td[i].B(), td[i].Result(), td[i].id());
//     }
//     return 0;
// }

// class ThreadData
// {
// public:
//     ThreadData()
//     {
//     }
//     void Init(const string &name, int a, int b)
//     {
//         _name = name;
//         _a = a;
//         _b = b;
//     }
//     void Excute()
//     {
//         _result = _a + _b;
//     }
//     int Result() { return _result; }
//     string &Name() { return _name; }
//     void Setid(pthread_t id) { _id = id; }
//     pthread_t Id() { return _id; }
//     int A(){return _a;}
//     int B(){return _b;}
//     ~ThreadData()
//     {
//     }

// private:
//     string _name;
//     int _a;
//     int _b;
//     int _result;
//     pthread_t _id;
// };

// void *routine(void *args)
// {
//     ThreadData *td = static_cast<ThreadData*>(args);
//     while (true)
//     {
//         cout << "我是新线程，我的名字是：" << td->Name() << ", id : " << td->Id() << endl;
//         td->Excute();
//         sleep(1);
//         break;
//     }
//     return td;
// }

// #define NUM 10

// int main()
// {
//     // 1.准备要加工的数据
//     ThreadData td[NUM];
//     for (int i = 0; i < NUM; i++)
//     {
//         char buffer[64];
//         snprintf(buffer, sizeof(buffer), "thread_%d", i);
//         td[i].Init(buffer, i * 10, i * 20);
//     }

//     //2.创建多个线程
//     for (int i = 0; i < NUM; i++)
//     {
//         pthread_t tid;
//         pthread_create(&tid, nullptr, routine, &td[i]);
//         td[i].Setid(tid);
//     }

//     //3.等待多个线程
//     for (int i = 0; i < NUM; i++)
//     {
//         pthread_join(td[i].Id(), nullptr);
//     }

//     //4.汇总处理结果
//     for (int i = 0; i < NUM; i++)
//     {
//         printf("td[%d]: %d+%d=%d[%ld]\n", i, td[i].A(), td[i].B(), td[i].Result(), td[i].Id());
//     }
//     return 0;
// }



// string ToHex(pthread_t id)
// {
//     //4.进程内的函数，线程共享
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", id);
//     return buffer;
// }

// void *routine(void *args)
// {
//     //3.如果不加保护，显示器文件就是共享资源，会被重入
//     string name = static_cast<const char*>(args);
//     while (true)
//     {
//         cout << "我是新线程，我的名字是：" << name << ", id : " << ToHex(pthread_self()) << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     //1.新线程和main线程谁先运行，是不确定的
//     //2.新线程创建出来，要瓜分进程的时间片
//     pthread_t tid;
//     pthread_create(&tid, nullptr, routine, (void*)"thread_1");

//     while (true)
//     {
//         cout << "我是main线程..." << endl;
//         sleep(1);
//     }
//     return 0;
// }

// //新线程
// void *run(void *args)
// {
//     while (true)
//     {
//         cout << "new thread, pid : " << getpid() << endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     cout << "I am a process, pid : " << getpid() << endl;
//     pthread_t tid;
//     pthread_create(&tid, nullptr, run, (void*)"thread_1");

//     //主线程
//     while (true)
//     {
//         cout << "main thread, pid : " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }